// package com.xuyuan.cpn.redis.lock;
//
// import com.xuyuan.util.SpringUtil;
// import org.apache.commons.lang3.StringUtils;
// import org.slf4j.Logger;
// import org.slf4j.LoggerFactory;
// import org.springframework.beans.factory.InitializingBean;
// import org.springframework.data.redis.core.RedisTemplate;
// import org.springframework.data.redis.core.script.DefaultRedisScript;
// import org.springframework.data.redis.core.script.RedisScript;
// import org.springframework.stereotype.Component;
//
// import java.util.Collections;
// import java.util.concurrent.TimeUnit;
//
// @Component
// public class SetnxLockImpl implements DistributedLock, InitializingBean {
//
//     private static final Logger logger = LoggerFactory.getLogger(SetnxLockImpl.class);
//
//     /**
//      * redis lua脚本
//      */
//     private static final String LUASCRIPT = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
//
//     private RedisTemplate<String, Object> redisTemplate;
//
//     @Override
//     public Boolean tryGetDistributedLock(String lockKey, String requestId, int expireTime) {
//         if (StringUtils.isBlank(lockKey) || StringUtils.isBlank(requestId)) {
//             throw new IllegalArgumentException("lockKey 和 requestId 不能为空");
//         }
//         try {
//             Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, requestId, expireTime, TimeUnit.SECONDS);
//             if (result != null && result) {
//                 logger.info("成功获取SETNX分布式锁，lockKey: {}, requestId: {}", lockKey, requestId);
//             } else {
//                 logger.warn("未能获取SETNX分布式锁，lockKey: {}, requestId: {}", lockKey, requestId);
//             }
//             return result != null && result;
//         } catch (Exception e) {
//             logger.error("获取SETNX分布式锁失败", e);
//             throw new RuntimeException("获取SETNX分布式锁失败", e);
//         }
//     }
//
//     /**
//      * 不安全的释放分布式锁
//      */
//     public boolean releaseDistributedLockForNoSafe(String lockKey, String requestId) {
//         Object object = redisTemplate.opsForValue().get(lockKey);
//         if (object != null && object.equals(requestId)) redisTemplate.opsForValue().getAndDelete(lockKey);
//         return true;
//     }
//
//     @Override
//     public Boolean releaseDistributedLock(String lockKey, String requestId) {
//         if (StringUtils.isBlank(lockKey) || StringUtils.isBlank(requestId)) {
//             throw new IllegalArgumentException("lockKey 和 requestId 不能为空");
//         }
//         try {
//             // 使用 Lua 脚本确保原子性
//             RedisScript<Long> script = new DefaultRedisScript<>(LUASCRIPT, Long.class);
//             Long result = redisTemplate.execute(script, Collections.singletonList(lockKey), requestId);
//             if (result != null && result > 0) {
//                 logger.info("成功释放SETNX分布式锁，lockKey: {}, requestId: {}", lockKey, requestId);
//             } else {
//                 logger.warn("未能释放SETNX分布式锁，lockKey: {}, requestId: {}", lockKey, requestId);
//             }
//             return result != null && result > 0;
//         } catch (Exception e) {
//             logger.error("释放SETNX分布式锁失败", e);
//             throw new RuntimeException("释放SETNX分布式锁失败", e);
//         }
//     }
//
//     @Override
//     public void afterPropertiesSet() throws Exception {
//         redisTemplate = SpringUtil.getBean(RedisTemplate.class);
//         if (redisTemplate == null) {
//             logger.error("RedisTemplate 未初始化");
//             throw new IllegalStateException("RedisTemplate 未初始化");
//         }
//         logger.info("RedisTemplate 初始化成功");
//     }
//
// }
